<?php

namespace App\Http\Controllers\HardWareApi;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Database\QueryException;
use App\Models\HardWareApi\TrashMessage;
use App\Models\OperationManagement\TrashSite;
use Illuminate\Support\Facades\DB;
use http\Env\Response;
use GatewayClient\Gateway;
use Grimzy\LaravelMysqlSpatial\Types\Point;

/**
 * @group 垃圾桶管理
 *
 * 采用 restful api
 *
 * Body Parameters 表示请求的所需要的参数
 *
 * Query Parameters 表示返回参数的名称
 */
class TrashMessageController extends Controller
{
	public function __construct()
    {
        Gateway::$registerAddress = '127.0.0.1:12360';
    }

    /**
     * 垃圾桶查看列表
     * @bodyParam trash_id int 垃圾点位id
     * @bodyParam number int 垃圾桶编号
     * @bodyParam location string 经纬度-点 115.24556 25.14551
     *
     * @queryParam trash_id int 垃圾点位id
     * @queryParam number int 垃圾桶编号
     * @queryParam imei int 设备唯一imei
     * @queryParam iccid int 20位nb卡号(字母和数字混合)
     * @queryParam imsi  int  15位imsi
     * @queryParam type  int  设备类别，1 有害垃圾，2 可回收垃圾，3 干垃圾 4 湿垃圾
     * @queryParam bulk  string  垃圾桶容量体积
     * @queryParam gps_sta int gps 定位状态，1 已定位，0 未定位
     * @queryParam location string 经纬度-点 115.24556 25.14551
     * @queryParam lac int 小区号，用于 lbs 基站定位
     * @queryParam ci int 基站号，用于 lbs 基站定位
     * @queryParam ir_sta string 红外对射状态，1 遮挡，0 未遮挡[0,0,1]
     * @queryParam distance float 超声波测量距离，单位米,保留 2 位小数
     * @queryParam power_vol float 电池电压，单位 v,保留 3 位小数
     * @queryParam status int 状态 1可用 2需维修 3需更换
     * @queryParam company string 所属公司
     * @queryParam own int 归属 0共有 1私有
     * @queryParam damage boolean 是否损坏 0是 1否
     * @queryParam overflowing boolean 是否满溢 0是 1否
     *
     * @return \Illuminate\Http\Response
     */
	public function index(Request $request)
	{
		$trashMessage = new TrashMessage;
        $data = $trashMessage->getList($request);
        return response()->json(encodeMsg($data,200));
	}

    /**
     * 添加垃圾桶
     *
     * @bodyParam trash_id int 垃圾点位id
     * @bodyParam number int 垃圾桶编号
     * @bodyParam imei int 设备唯一imei
     * @bodyParam iccid int 20位nb卡号(字母和数字混合)
     * @bodyParam imsi  int  15位imsi
     * @bodyParam type  int  设备类别，1 有害垃圾，2 可回收垃圾，3 干垃圾 4 湿垃圾
     * @bodyParam bulk  string  垃圾桶容量体积
     * @bodyParam gps_sta int gps 定位状态，1 已定位，0 未定位
     * @bodyParam location string 经纬度-点 115.24556 25.14551
     * @bodyParam lac int 小区号，用于 lbs 基站定位
     * @bodyParam ci int 基站号，用于 lbs 基站定位
     * @bodyParam ir_sta string 红外对射状态，1 遮挡，0 未遮挡[0,0,1]
     * @bodyParam distance float 超声波测量距离，单位米,保留 2 位小数
     * @bodyParam power_vol float 电池电压，单位 v,保留 3 位小数
     * @bodyParam status int 状态 1可用 2需维修 3需更换
     * @bodyParam company string 所属公司
     * @bodyParam own int 归属 0共有 1私有
     * @bodyParam damage boolean 是否损坏 0是 1否
     * @bodyParam overflowing boolean 是否满溢 0是 1否
     *
     * @queryParam trash_id int 垃圾点位id
     * @queryParam number int 垃圾桶编号
     * @queryParam imei int 设备唯一imei
     * @queryParam iccid int 20位nb卡号(字母和数字混合)
     * @queryParam imsi  int  15位imsi
     * @queryParam type  int  设备类别，1 有害垃圾，2 可回收垃圾，3 干垃圾 4 湿垃圾
     * @queryParam bulk  string  垃圾桶容量体积
     * @queryParam gps_sta int gps 定位状态，1 已定位，0 未定位
     * @queryParam location string 经纬度-点 115.24556 25.14551
     * @queryParam lac int 小区号，用于 lbs 基站定位
     * @queryParam ci int 基站号，用于 lbs 基站定位
     * @queryParam ir_sta string 红外对射状态，1 遮挡，0 未遮挡[0,0,1]
     * @queryParam distance float 超声波测量距离，单位米,保留 2 位小数
     * @queryParam power_vol float 电池电压，单位 v,保留 3 位小数
     * @queryParam status int 状态 1可用 2需维修 3需更换
     * @queryParam company string 所属公司
     * @queryParam own int 归属 0共有 1私有
     * @queryParam damage boolean 是否损坏 0是 1否
     * @queryParam overflowing boolean 是否满溢 0是 1否
     *
     * @return \Illuminate\Http\Response
     */
	public function store(Request $request)
	{
		$data = array();
        DB::beginTransaction();
        try {
            $data = $request->all();
            // $data['location'] = \DB::raw("GeomFromText('Point({$request->input('location')})')");
            $location = $request->input('location','');
            if(!empty($location)){
                $data['location'] = Point::fromString($location);
            }
            $trashMessage = TrashMessage::create($data);
            $trash_id = $request->input('trash_id'.'');
            $num = TrashMessage::where('trash_id',$trash_id)->count();
            TrashSite::where('id',$trash_id)->update(['number'=>$num]);
            DB::commit();
            return response()->json(encodeMsg($trashMessage,201));
        } catch (QueryException $e) {
            DB::rollBack();
            return response()->json(encodeMsg(['message' => '垃圾桶添加失败!'],400));
        }
	}

    /**
     * 查看垃圾桶
     *
     * @bodyParam id int 垃圾桶id
     *
     * @queryParam trash_id int 垃圾点位id
     * @queryParam number int 垃圾桶编号
     * @queryParam imei int 设备唯一imei
     * @queryParam iccid int 20 位nb卡号(字母和数字混合)
     * @queryParam imsi  int  15位imsi
     * @queryParam type  int  设备类别，1 有害垃圾，2 可回收垃圾，3 干垃圾 4 湿垃圾
     * @queryParam bulk  string  垃圾桶容量体积
     * @queryParam gps_sta int gps 定位状态，1 已定位，0 未定位
     * @queryParam location string 经纬度-点 115.24556 25.14551
     * @queryParam lac int 小区号，用于 lbs 基站定位
     * @queryParam ci int 基站号，用于 lbs 基站定位
     * @queryParam ir_sta string 红外对射状态，1 遮挡，0 未遮挡[0,0,1]
     * @queryParam distance float 超声波测量距离，单位米,保留 2 位小数
     * @queryParam power_vol float 电池电压，单位 v,保留 3 位小数
     * @queryParam status int 状态 1可用 2需维修 3需更换
     * @queryParam company string 所属公司
     * @queryParam own int 归属 0共有 1私有
     * @queryParam damage boolean 是否损坏 0是 1否
     * @queryParam overflowing boolean 是否满溢 0是 1否
     *
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        $data = TrashMessage::find($id);
        if($data == []) {
            return response()->json(encodeMsg(["message" => "没有该垃圾桶信息!"], 404));
        } else {
            return response()->json(encodeMsg($data,200));
        }
    }

    /**
     * 修改垃圾桶
     *
     * @bodyParam trash_id int 垃圾点位id
     * @bodyParam id int 垃圾桶id
     * @bodyParam number int 垃圾桶编号
     * @bodyParam imei int 设备唯一imei
     * @bodyParam iccid int 20位nb卡号(字母和数字混合)
     * @bodyParam imsi  int  15位imsi
     * @bodyParam type  int  设备类别，1 有害垃圾，2 可回收垃圾，3 干垃圾 4 湿垃圾
     * @bodyParam bulk  string  垃圾桶容量体积
     * @bodyParam gps_sta int gps 定位状态，1 已定位，0 未定位
     * @bodyParam location string 经纬度-点 115.24556 25.14551
     * @bodyParam lac int 小区号，用于 lbs 基站定位
     * @bodyParam ci int 基站号，用于 lbs 基站定位
     * @bodyParam ir_sta string 红外对射状态，1 遮挡，0 未遮挡[0,0,1]
     * @bodyParam distance float 超声波测量距离，单位米,保留 2 位小数
     * @bodyParam power_vol float 电池电压，单位 v,保留 3 位小数
     * @bodyParam status int 状态 1可用 2需维修 3需更换
     * @bodyParam company string 所属公司
     * @bodyParam own int 归属 0共有 1私有
     * @bodyParam damage boolean 是否损坏 0是 1否
     * @bodyParam overflowing boolean 是否满溢 0是 1否
     *
     * @queryParam trash_id int 垃圾点位id
     * @queryParam number int 垃圾桶编号
     * @queryParam imei int 设备唯一imei
     * @queryParam iccid int 20位nb卡号(字母和数字混合)
     * @queryParam imsi  int  15位imsi
     * @queryParam type  int  设备类别，1 有害垃圾，2 可回收垃圾，3 干垃圾 4 湿垃圾
     * @queryParam bulk  string  垃圾桶容量体积
     * @queryParam gps_sta int gps 定位状态，1 已定位，0 未定位
     * @queryParam location string 经纬度-点 115.24556 25.14551
     * @queryParam lac int 小区号，用于 lbs 基站定位
     * @queryParam ci int 基站号，用于 lbs 基站定位
     * @queryParam ir_sta string 红外对射状态，1 遮挡，0 未遮挡[0,0,1]
     * @queryParam distance float 超声波测量距离，单位米,保留 2 位小数
     * @queryParam power_vol float 电池电压，单位 v,保留 3 位小数
     * @queryParam status int 状态 1可用 2需维修 3需更换
     * @queryParam company string 所属公司
     * @queryParam own int 归属 0共有 1私有
     * @queryParam damage boolean 是否损坏 0是 1否
     * @queryParam overflowing boolean 是否满溢 0是 1否
     *
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $trashMessage = TrashMessage::find($id);
        if($trashMessage == []) {
            return response()->json(encodeMsg(["message" => "没有该垃圾桶信息!"], 404));
        }
        try {
            $data = $request->all();
            $location = $request->input('location','');
            if(!empty($location)){
                $data['location'] = Point::fromString($location);
            }
            $trashMessage->update($data);
            return response()->json(encodeMsg($trashMessage,200));
        } catch (QueryException $e) {
            return response()->json(encodeMsg(['message' => '垃圾桶修改失败!'],400));
        }
    }

    /**
     * 批量删除垃圾桶
     *
     * @bodyParam  ids int required  id集合字符串[格式：ids=1,2,3]
     * @response 204 {
     *   "message": "市政部件删除成功"
     * }
     *
     *
     */
    public function destroy($id)
    {
        $governmentDevice = GovernmentDevice::find($id);
        if($governmentDevice == []) {
            return response()->json(encodeMsg(["message" => "没有该垃圾桶信息!"], 404));
        }
        DB::beginTransaction();
        try {
            $trash_id = $governmentDevice->trash_id;
            $governmentDevice->delete();
            $num = TrashMessage::where('trash_id',$trash_id)->count();
            TrashSite::where('id',$trash_id)->update(['number'=>$num]);
            DB::commit();
            return response()->json(encodeMsg(["message" => "垃圾桶删除成功!"], 204));
        } catch (QueryException $e) {
            return response()->json(encodeMsg(['message' => '垃圾桶删除失败!'],400));
        }
    }

    /**
     * 由服务端主动与指定客户端通讯
     * @param $id 客户端（用户或设备等）的唯一标识
     * @param $response
     */
    public function sendToClient($id,$response)
    {
        Gateway::sendToUid($id, json_encode($response));
    }


    /**
     * 由服务端主动与全部客户端通讯
     * @return \Exception|string
     */
    public function sendToAll()
    {
        try{
            Gateway::sendToAll('我是服务器~~~');
        }catch (\Exception $e){
            return $e;
        }

        return '已给所有在线客户端发送消息';
    }

}
